package siafi.db;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.apache.log4j.Logger;

public class Procedimientos {

	private static Logger log = Logger.getLogger(Procedimientos.class);

	public String documentoCrear(String idu_entidad, String cod_servicio,
			long valor_total, long ide_persona, String cod_centro, Connection conn) throws SQLException {
		String resultado = "El recibo se ha generado correctamente ";
		Calendar cal = Calendar.getInstance();
		
			SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
		

			/*
			 * PIDUUNIDAD VARCHAR2(9); PIDEDOCUMENTO NUMBER; PVIGDOCUMENTO
			 * NUMBER; PFECDOCUMENTO DATE; PDESDOCUMENTO VARCHAR2(4000);
			 * PVALDOCUMENTO NUMBER; PFECVENCIMIENTO DATE; PINDDOCUMENTO
			 * CHAR(1); PCODOPERACION VARCHAR2(32); PCODMONEDA NUMBER;
			 * PIDETERCERO NUMBER; PIDEORDENADOR NUMBER; PCODCENTRO
			 * VARCHAR2(32); PCODDEPENDENCIA VARCHAR2(32); PNROSOPORTE
			 * VARCHAR2(20); PFECSOPORTE DATE; PIDUREFERENCIA VARCHAR2(24);
			 * PIDUREFERENCIA1 VARCHAR2(24); PIDUREFERENCIA2 VARCHAR2(24);
			 * PIDUREFERENCIA3 VARCHAR2(24); PLOCDOCUMENTO VARCHAR2(250);
			 * PVALIVA NUMBER; PVALREFERENCIA1 NUMBER; PVALREFERENCIA2 NUMBER;
			 * PVALREFERENCIA3 NUMBER; PVALREFERENCIA4 NUMBER; PVALREFERENCIA5
			 * NUMBER; PVALREFERENCIA6 NUMBER; PCANREFERENCIA1 NUMBER;
			 * PCANREFERENCIA2 NUMBER; PCANREFERENCIA3 NUMBER; PCANREFERENCIA4
			 * NUMBER; PCANREFERENCIA5 NUMBER; PFECREFERENCIA1 DATE;
			 * PFECREFERENCIA2 DATE; PFECREFERENCIA3 DATE; PFECREFERENCIA4 DATE;
			 * PFECREFERENCIA5 DATE; PVALCAUSACION NUMBER; PIDUDOCUMENTO
			 * VARCHAR2(200); POPCION NUMBER;
			 */

			String query = "{call Documento.Creacion(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
			CallableStatement cs = conn.prepareCall(query);
			cs.setString("PIDUUNIDAD", idu_entidad);
			cs.setInt("PIDEDOCUMENTO", 644);
			cs.setLong("PVIGDOCUMENTO", cal.get(Calendar.YEAR));
			cs.setString("PFECDOCUMENTO", dateformat.format(cal.getTime()));
			cs.setString("PDESDOCUMENTO",
					TerceroDAO.findServicios().get(cod_servicio));
			cs.setLong("PVALDOCUMENTO", valor_total);
			cal.add(Calendar.DATE, 1);
			cs.setString("PFECVENCIMIENTO", dateformat.format(cal.getTime()));
			cs.setNull("PINDDOCUMENTO", java.sql.Types.VARCHAR);
			cs.setString("PCODOPERACION", cod_servicio);
			cs.setInt("PCODMONEDA", 16001);
			cs.setLong("PIDETERCERO", ide_persona);
			cs.setInt("PIDEORDENADOR", 0);
			cs.setString("PCODCENTRO", cod_centro);
			cs.setString("PCODDEPENDENCIA", "99001");
			cs.setNull("PNROSOPORTE", java.sql.Types.VARCHAR);
			cs.setNull("PFECSOPORTE", java.sql.Types.DATE);
			cs.setString("PIDUREFERENCIA", "999900101000205099999900");
			cs.setString("PIDUREFERENCIA1", "999900101000205099999900");
			cs.setString("PIDUREFERENCIA2", "999900101000205099999900");
			cs.setString("PIDUREFERENCIA3", "999900101000205099999900");
			cs.setString("PLOCDOCUMENTO", "0");
			cs.setString("PIDUDOCUMENTO", "0");
			cs.setInt("PVALIVA", 0);
			cs.setInt("PVALREFERENCIA1", 0);
			cs.setInt("PVALREFERENCIA2", 0);
			cs.setInt("PVALREFERENCIA3", 0);
			cs.setInt("PVALREFERENCIA4", 0);
			cs.setInt("PVALREFERENCIA5", 0);
			cs.setInt("PVALREFERENCIA6", 0);
			cs.setInt("PCANREFERENCIA1", 0);
			cs.setInt("PCANREFERENCIA2", 0);
			cs.setInt("PCANREFERENCIA3", 0);
			cs.setInt("PCANREFERENCIA4", 0);
			cs.setInt("PCANREFERENCIA5", 0);
			cs.setNull("PFECREFERENCIA1", java.sql.Types.DATE);
			cs.setNull("PFECREFERENCIA2", java.sql.Types.DATE);
			cs.setNull("PFECREFERENCIA3", java.sql.Types.DATE);
			cs.setNull("PFECREFERENCIA4", java.sql.Types.DATE);
			cs.setNull("PFECREFERENCIA5", java.sql.Types.DATE);
			cs.setLong("PVALCAUSACION", valor_total);
			cs.setInt("POPCION", 1);
			cs.registerOutParameter("PIDUDOCUMENTO", Types.VARCHAR);
			cs.execute();
			String output_parm2 = cs.getString("PIDUDOCUMENTO");
			resultado += String.valueOf(output_parm2);
			cs.close();
		
		return resultado;
	}

	public String documentoCrear2(String wIduUnidad, String wDesDocumento,
			long wValDocumento, String wCodOperacion, Long wIdeTercero,Connection conn) throws SQLException {
		String resultado = null;
		Calendar cal = Calendar.getInstance();
		
			SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
		

			/*
			 * PIDUUNIDAD VARCHAR2(9); PIDEDOCUMENTO NUMBER; PVIGDOCUMENTO
			 * NUMBER; PFECDOCUMENTO DATE; PDESDOCUMENTO VARCHAR2(4000);
			 * PVALDOCUMENTO NUMBER; PFECVENCIMIENTO DATE; PINDDOCUMENTO
			 * CHAR(1); PCODOPERACION VARCHAR2(32); PCODMONEDA NUMBER;
			 * PIDETERCERO NUMBER; PIDEORDENADOR NUMBER; PCODCENTRO
			 * VARCHAR2(32); PCODDEPENDENCIA VARCHAR2(32); PNROSOPORTE
			 * VARCHAR2(20); PFECSOPORTE DATE; PIDUREFERENCIA VARCHAR2(24);
			 * PIDUREFERENCIA1 VARCHAR2(24); PIDUREFERENCIA2 VARCHAR2(24);
			 * PIDUREFERENCIA3 VARCHAR2(24); PLOCDOCUMENTO VARCHAR2(250);
			 * PVALIVA NUMBER; PVALREFERENCIA1 NUMBER; PVALREFERENCIA2 NUMBER;
			 * PVALREFERENCIA3 NUMBER; PVALREFERENCIA4 NUMBER; PVALREFERENCIA5
			 * NUMBER; PVALREFERENCIA6 NUMBER; PCANREFERENCIA1 NUMBER;
			 * PCANREFERENCIA2 NUMBER; PCANREFERENCIA3 NUMBER; PCANREFERENCIA4
			 * NUMBER; PCANREFERENCIA5 NUMBER; PFECREFERENCIA1 DATE;
			 * PFECREFERENCIA2 DATE; PFECREFERENCIA3 DATE; PFECREFERENCIA4 DATE;
			 * PFECREFERENCIA5 DATE; PVALCAUSACION NUMBER; PIDUDOCUMENTO
			 * VARCHAR2(200); POPCION NUMBER;
			 */

			String query = "{call Documento.Creacion(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";
			CallableStatement cs = conn.prepareCall(query);
			cs.setString("PIDUUNIDAD", wIduUnidad);
			cs.setInt("PIDEDOCUMENTO", 644);
			cs.setInt("PVIGDOCUMENTO", cal.get(Calendar.YEAR));
			cs.setString("PFECDOCUMENTO", dateformat.format(cal.getTime()));
			cs.setString("PDESDOCUMENTO", wDesDocumento);
			cs.setFloat("PVALDOCUMENTO", wValDocumento);
			cal.add(Calendar.DATE, 7);
			cs.setString("PFECVENCIMIENTO", dateformat.format(cal.getTime()));
			cs.setNull("PINDDOCUMENTO", java.sql.Types.VARCHAR);
			cs.setString("PCODOPERACION", wCodOperacion);
			cs.setInt("PCODMONEDA", 16001);
			cs.setLong("PIDETERCERO", wIdeTercero);
			cs.setInt("PIDEORDENADOR", 0);
			cs.setString("PCODCENTRO", "99001");
			cs.setString("PCODDEPENDENCIA", "99001");
			cs.setNull("PNROSOPORTE", java.sql.Types.VARCHAR);
			cs.setNull("PFECSOPORTE", java.sql.Types.DATE);
			cs.setString("PIDUREFERENCIA", "999900101000205099999900");
			cs.setString("PIDUREFERENCIA1", "999900101000205099999900");
			cs.setString("PIDUREFERENCIA2", "999900101000205099999900");
			cs.setString("PIDUREFERENCIA3", "999900101000205099999900");
			cs.setNull("PLOCDOCUMENTO", java.sql.Types.VARCHAR);
			cs.setString("PIDUDOCUMENTO", "0");
			cs.setInt("PVALIVA", 0);
			cs.setInt("PVALREFERENCIA1", 0);
			cs.setInt("PVALREFERENCIA2", 0);
			cs.setInt("PVALREFERENCIA3", 0);
			cs.setInt("PVALREFERENCIA4", 0);
			cs.setInt("PVALREFERENCIA5", 0);
			cs.setInt("PVALREFERENCIA6", 0);
			cs.setInt("PCANREFERENCIA1", 0);
			cs.setInt("PCANREFERENCIA2", 0);
			cs.setInt("PCANREFERENCIA3", 0);
			cs.setInt("PCANREFERENCIA4", 0);
			cs.setInt("PCANREFERENCIA5", 0);
			cs.setNull("PFECREFERENCIA1", java.sql.Types.DATE);
			cs.setNull("PFECREFERENCIA2", java.sql.Types.DATE);
			cs.setNull("PFECREFERENCIA3", java.sql.Types.DATE);
			cs.setNull("PFECREFERENCIA4", java.sql.Types.DATE);
			cs.setNull("PFECREFERENCIA5", java.sql.Types.DATE);
			cs.setFloat("PVALCAUSACION", wValDocumento);
			cs.setInt("POPCION", 1);
			cs.registerOutParameter("PIDUDOCUMENTO", Types.VARCHAR);
			cs.execute();
			String output_parm2 = cs.getString("PIDUDOCUMENTO");
			resultado = String.valueOf(output_parm2);
			cs.close();
		return resultado;
	}
	
	
	public String beneficiarios(String wIduDocumento, int wCodVinculacion, Connection conn) throws SQLException {
		String resultado = null;
		

			/*
			pIduDocumento       = wIduDocumento,
pIduReferencia      = '999900101000205099999900',
pIduReferencia1     = '999900101000205099999900',
pIdeBeneficiario    = 0,
pIdeTercero         = 0,
pCodConcepto1       = '99001',
pCodConcepto2       = '99001',
pCodDominio1        = wCodVinculacion,
pCodDominio2        = 999901,
pCodDominio3        = 999901,
pCodDominio4        = 999901, 
pFecReferencia1     = NULL, 
pFecReferencia2     = NULL,
pFecReferencia3     = NULL, 
pCanReferencia1     = 0, 
pCanReferencia2     = 0, 
pCanReferencia3     = 0, 
pValReferencia0     = 0, 
pValReferencia1     = 0, 
pValReferencia2     = 0, 
pValReferencia3     = 0, 
pValReferencia4     = 0, 
pValReferencia5     = 0, 
pValReferencia6     = 0, 
pValReferencia7     = 0, 
pValReferencia8     = 0, 
pValReferencia9     = 0, 
pDesBeneficiario    = NULL, 
pOpcion             = 1
			 */

			String query = "{call Documento.Beneficiarios(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
					+ "?,?,?,?,?,?,?,?)}";
			CallableStatement cs = conn.prepareCall(query);
			cs.setString("pIduDocumento", wIduDocumento);
			cs.setString("pIduReferencia", "999900101000205099999900");
			cs.setString("pIduReferencia1", "999900101000205099999900");
			cs.setInt("pIdeBeneficiario", 0);
			cs.setInt("pIdeTercero", 0);
			cs.setString("pCodConcepto1", "99001");
			cs.setString("pCodConcepto2", "99001");
			cs.setInt("pCodDominio1", wCodVinculacion);
			cs.setInt("pCodDominio2", 999901);
			cs.setInt("pCodDominio3", 999901);
			cs.setInt("pCodDominio4", 999901);
			cs.setNull("pFecReferencia1", java.sql.Types.DATE);			
			cs.setNull("pFecReferencia2", java.sql.Types.DATE);
			cs.setNull("pFecReferencia3", java.sql.Types.DATE);
			cs.setInt("pCanReferencia1", 0);
			cs.setInt("pCanReferencia2", 0);
			cs.setInt("pCanReferencia3", 0);
			cs.setInt("pValReferencia0", 0);
			cs.setInt("pValReferencia1", 0);
			cs.setInt("pValReferencia2", 0);
			cs.setInt("pValReferencia3", 0);
			cs.setInt("pValReferencia4", 0);
			cs.setInt("pValReferencia5", 0);
			cs.setInt("pValReferencia6", 0);
			cs.setInt("pValReferencia7", 0);
			cs.setInt("pValReferencia8", 0);
			cs.setInt("pValReferencia9", 0);
			cs.setNull("pDesBeneficiario", Types.VARCHAR);
			cs.setInt("POPCION", 1);
			cs.execute();
			
			resultado = "El beneficiario se genero";
			cs.close();
		return resultado;
	}
	
	
	/**
	 * 
	 * @param idu_documento
	 * @param cod_dconcepto
	 * @param ide_persona
	 * @param cod_centro
	 * @param id_tercero
	 * @param valor
	 * @param cantidad
	 * @return
	 * @throws SQLException 
	 */

	public String liquidacion(String idu_documento, String cod_dconcepto,
			long ide_persona, String cod_centro, long id_tercero, Float valor,
			int cantidad, Connection conn) throws SQLException {
		String resultado = "El recibo se ha generado correctamente ";
		
			
			/*
			 * PIDUDOCUMENTO VARCHAR2(24); PCODLIQUIDACION VARCHAR2(32);
			 * PCODSUBLIQUIDACION NUMBER; PIDETERCERO NUMBER; PCODCENTRO
			 * VARCHAR2(32); PIDEBENEFICIARIO NUMBER; PVALBASE NUMBER;
			 * PCANLIQUIDACION NUMBER; PVALLIQUIDACION NUMBER; POPCION NUMBER;
			 */

			String query = "{call Liquidacion.Liquidacion(?,?,?,?,?,?,?,?,?,?)}";
			CallableStatement cs = conn.prepareCall(query);
			cs.setString("PIDUDOCUMENTO", idu_documento);
			cs.setString("PCODLIQUIDACION", cod_dconcepto);
			cs.setInt("PCODSUBLIQUIDACION", 104000);
			cs.setLong("PIDETERCERO", ide_persona);
			cs.setString("PCODCENTRO", cod_centro);
			cs.setLong("PIDEBENEFICIARIO", id_tercero);
			cs.setFloat("PVALBASE", valor);
			cs.setFloat("PCANLIQUIDACION", cantidad);
			cs.setFloat("PVALLIQUIDACION", Math.round(valor * (float)cantidad));
			cs.setInt("POPCION", 1);

			cs.execute();
			cs.close();
		
		return resultado;
	}

	public String documentoEstado(String idu_documento, Connection conn) throws SQLException {
		String resultado = "El recibo se ha generado correctamente ";
		Calendar cal = Calendar.getInstance();
	
			SimpleDateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy");
			/*
			 * PIDUDOCUMENTO VARCHAR2(24); PCODESTADO NUMBER; PCODSUBESTADO
			 * NUMBER; PFECESTADO DATE; PDESESTADO VARCHAR2(4000); PFIRMA
			 * VARCHAR2(38);
			 */

			String query = "{call Documento.Estados(?,?,?,?,?,?)}";
			CallableStatement cs = conn.prepareCall(query);
			cs.setString("PIDUDOCUMENTO", idu_documento);
			cs.setInt("PCODESTADO", 998002);
			cs.setInt("PCODSUBESTADO", 996000);
			cs.setString("PFECESTADO", dateformat.format(cal.getTime()));
			cs.setNull("PDESESTADO", java.sql.Types.VARCHAR);
			cs.setNull("PFIRMA", java.sql.Types.VARCHAR);

			cs.execute();
			cs.close();
	
		return resultado;
	}

	/**
	 * Metodo que recupera todos los mensajes
	 * 
	 * @return int codigo del mensaje
	 */
	public String getMensajes(int cod_mensaje, Connection con) {

		log.info("Inicio - getMensajes()");
		Statement st = null;
		ResultSet rs = null;
		
		String mensaje = "";
		try {
			st = con.createStatement();
			StringBuffer sb = new StringBuffer();
			sb.append("select nom_mensaje from mensajes where ide_mensaje = "
					+ cod_mensaje);
			rs = st.executeQuery(sb.toString());
			while (rs.next()) {
				mensaje = rs.getString(1);
			}

		} catch (SQLException sqle) {
			log.error(sqle.getMessage());
			for (StackTraceElement elem : sqle.getStackTrace()) {
				log.error(elem.toString());
			}
			log.error("Error SQL en el metodo getMensajes() de la clase Procedimientos: "
					+ sqle.getMessage());
		} finally {
		try {
			con.close();
			st.close();
			rs.close();
		} catch (SQLException e) {
			log.info(e.getMessage());
			for(StackTraceElement elem : e.getStackTrace()) {
				log.info(elem.toString());
			}
		}
	}
		log.info("Fin - getMensajes()");
		return mensaje;

	}
}

